package user

import (
	"fmt"
	"goframe-zc/dto"
	"goframe-zc/service"
	"goframe-zc/utility"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

// 注册请求参数（带校验规则）
type RegisterReq struct {
	g.Meta `path:"/register" method:"post" summary:"用户注册接口"`
	Name   string `json:"name" v:"required#用户名不能为空"`
	Phone  string `json:"phone" v:"required|phone#手机号不能为空|手机号格式错误"`
	Pass   string `json:"pass" v:"required|length:6,20#密码不能为空|密码长度必须6-20位"`
}

// 注册响应数据
type RegisterRes struct {
	Id   int    `json:"id"`   // 用户ID
	Name string `json:"name"` // 用户名
}

// 注册接口实现
func Register(r *ghttp.Request) {
	var req RegisterReq
	// 1. 参数绑定与校验（自动校验结构体v标签规则）
	if err := r.Parse(&req); err != nil {
		utility.ResponseError(r, 400, err.Error())
		return
	}

	// 2. 调用Service层注册业务
	userID, err := service.User.Register(r.Context(), req.Phone, req.Pass)
	if err != nil {
		utility.ResponseError(r, 500, err.Error())
		return
	}

	// 3. 返回成功响应
	utility.ResponseSuccess(r, RegisterRes{
		Id:   userID,
		Name: req.Name,
	})
}

// 登录请求参数
type LoginReq struct {
	g.Meta   `path:"/login" method:"post" summary:"用户登录接口"`
	Phone    string `json:"phone" v:"required|phone#手机号不能为空|手机号格式错误"`
	Password string `json:"password" v:"required#密码不能为空"`
}

// 登录响应数据（包含令牌和用户信息）
type LoginRes struct {
	Token    string      `json:"token"`     // JWT令牌
	UserInfo UserInfoRes `json:"user_info"` // 用户信息（不含敏感字段）
}
type UserInfoRes struct {
	Id    int    `json:"id"`
	Name  string `json:"name"`
	Phone string `json:"phone"`
}

// 登录接口实现
func Login(r *ghttp.Request) {
	var req LoginReq
	// 1. 参数绑定与校验
	if err := r.Parse(&req); err != nil {
		utility.ResponseError(r, 400, err.Error())
		return
	}

	// 2. 调用Service层登录业务
	user, err := service.User.Login(r.Context(), req.Phone, req.Password)
	if err != nil {
		utility.ResponseError(r, 500, err.Error())
		return
	}
	//
	//// 3. 返回成功响应（包含令牌和用户信息）
	utility.ResponseSuccess(r, user)
	return
}

// 获取个人信息接口实现（需JWT认证）
func Info(r *ghttp.Request) {
	// 1. 从上下文获取用户ID（JWT中间件已验证并存储）
	userID := r.GetCtxVar("userID").Int()
	if userID == 0 {
		//utility.ResponseError(r, 401, "用户ID获取失败")
		r.Exit()
		return
	}

	// 2. 调用Service层获取用户信息
	userInfo, err := service.User.GetInfo(r.Context(), userID)
	if err != nil {
		utility.ResponseError(r, 500, err.Error())
		r.Exit()
		return
	}

	// 3. 返回用户信息（不含密码）
	utility.ResponseSuccess(r, userInfo)
	return
}

// 获取个人订单列表接口实现（需JWT认证）
func OrderList(r *ghttp.Request) {
	var orderListReq dto.OrderListReq
	// 1. 参数绑定与校验
	fmt.Println("OrderList-orderListReq1", orderListReq)
	if err := r.Parse(&orderListReq); err != nil {
		utility.ResponseError(r, 400, err.Error())
		return
	}
	fmt.Println("OrderList-orderListReq2", orderListReq)
	// 1. 从上下文获取用户ID（JWT中间件已验证并存储）
	userID := r.GetCtxVar("userID").Uint()
	if userID == 0 {
		//utility.ResponseError(r, 401, "用户ID获取失败")
		r.Exit()
		return
	}

	// 2. 调用Service层获取用户信息
	userInfo, err := service.Order.GetOrderList(r.Context(), &orderListReq, userID)
	if err != nil {
		utility.ResponseError(r, 500, err.Error())
		r.Exit()
		return
	}

	// 3. 返回用户信息（不含密码）
	utility.ResponseSuccess(r, userInfo)
	return
}

// 获取个人订单列表接口实现（需JWT认证）
func OrderList2(r *ghttp.Request) {
	var orderListReq dto.OrderListReq
	// 1. 参数绑定与校验
	if err := r.Parse(&orderListReq); err != nil {
		utility.ResponseError(r, 400, err.Error())
		return
	}
	// 1. 从上下文获取用户ID（JWT中间件已验证并存储）
	userID := r.GetCtxVar("userID").Int()
	if userID == 0 {
		//utility.ResponseError(r, 401, "用户ID获取失败")
		r.Exit()
		return
	}

	// 2. 调用Service层获取用户信息
	userInfo, err := service.GetOrderList(r.Context(), userID, orderListReq.Page, orderListReq.Limit)
	if err != nil {
		utility.ResponseError(r, 500, err.Error())
		r.Exit()
		return
	}

	// 3. 返回用户信息（不含密码）
	utility.ResponseSuccess(r, userInfo)
	return
}
